"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 4、列表.py
"""

"""
常用数据结构：
    list 列表
    tuple 元组
    set 集合
    dict 字典

列表定义：
    列表是有序可变的元素集合，使用[]包围，元素之间用逗号分隔
    列表是动态的，可以随时扩展和收缩
    列表是异构的，可以同时存放不同类型的对象
    列表中允许出现重复的元素
"""

# 构造方法创建列表   传入可迭代对象
list1 = list('goodstart')
print(type(list1), list1)  # 结果：<class 'list'> ['g', 'o', 'o', 'd', 's', 't', 'a', 'r', 't']

# 中括号直接填充元素
list2 = ['g', 'o', 'o', 'd', 's', 't', 'a', 'r', 't']
print(type(list2), list2)  # 结果：<class 'list'> ['g', 'o', 'o', 'd', 's', 't', 'a', 'r', 't']

# 异构结构，可变
list3 = [1, 'str', 8.8, [1, 2], (3, 4), {'name': 'MarkJoa'}]
print(type(list3), list3)  # 结果：<class 'list'> [1, 'str', 8.8, [1, 2], (3, 4), {'name': 'MarkJoa'}]

# 列表推导式  取出10之内的所有偶数  [0, 2, 4, 6, 8, 10]
list4 = [i for i in range(11) if i % 2 == 0]  # [0, 2, 4, 6, 8, 10]
print(type(list4), list4)  # 结果：<class 'list'> [0, 2, 4, 6, 8, 10]

# 索引取值  打出2
for i, j in enumerate(list4):
    print(f'索引是{i}的值为{j}')  # 结果：索引是0的值为0......索引是5的值为10

# 列表切片  [开始值，结束值，步长]  左闭右开  步长默认是1
list4 = [i for i in range(11) if i % 2 == 0]  # [0, 2, 4, 6, 8, 10]
print(list4[1:-1:1])  # 结果：[2, 4, 6, 8]
print(list4[1::1])  # 结果：[2, 4, 6, 8,10]

# 列表运算符
# 重复  快速复制
li = [1] * 5
# 结果是 [1,1,1,1,1]
print(li)

# 相加合并  快速将两个列表合并
li1 = [1, 2, 3]
li2 = [99, 100]
# 结果是 [1,2,3,99,100]
print(li1 + li2)

# 判断成员是否在列表中
list4 = [i for i in range(11) if i % 2 == 0]  # [0, 2, 4, 6, 8, 10]
print(2 in list4)  # 结果：True

"""
1。列表方法  2、入参  3、返回值
append、extend、insert 是给列表添加元素
pop、remove 是从列表中移除
sort、reverse 是给列表排序
len()  检查列表中的元素个数
"""
# 列表的方法  append在列表末尾添加一个元素
list4 = []
print(len(list4))  # 结果：0
list4.append(12)
list4.append('str')
print(len(list4))  # 结果：2
print(list4)  # 结果：[12, 'str']

# extend 在末尾添加一个可迭代对象，如字符串、列表、元组、字典、集合
list4.extend('goodstudy')
print(list4)  # 结果：[12, 'str', 'g', 'o', 'o', 'd', 's', 't', 'u', 'd', 'y']
# 合并列表
list5 = [1, 2, 3]
list4.extend(list5)
print(list4)  # 结果：[12, 'str', 'g', 'o', 'o', 'd', 's', 't', 'u', 'd', 'y', 1, 2, 3]

# insert在列表插入值
list4.insert(0, -2)
print(list4)  # 结果：[-2, 12, 'str', 'g', 'o', 'o', 'd', 's', 't', 'u', 'd', 'y', 1, 2, 3]

# pop（索引）删除
list6 = [2, 6, 9, 3, 56, 345, 62213]
list6.pop(1)
print(list6)  # 把索引为1对应的值6删除。结果：[2, 9, 3, 56, 345, 62213]

# 不加索引弹出最后一个值
data = list6.pop()
print(data, list6)  # data = 删除最后一个数字62213。结果：62213   打印删除后的列表，结果：list6 =   [2, 9, 3, 56, 345]

# 列表中没有对应的索引
try:
    list6.pop(100)
    print('超出范围')
except Exception as e:
    print(f'错误信息:{e}')  # 抛出索引越界：错误信息:pop index out of range

# 列表为空删除
list7 = []
try:
    list7.pop()
    print('列表值为空')
except Exception as e:
    print(f'抛出错误：{e}')  # 抛出列表为空：抛出错误：pop from empty list

# remove(值)    移除列表中第一个为目标值索引的值
list8 = [1, 2, 3, 4, 1, 2, 3, 4]
list8.remove(1)
print(list8)  # 删除列表中第一个值为1的值。结果：[2, 3, 4, 1, 2, 3, 4]

# 值不存在
try:
    list8.remove(100)
    print('值不存在')
except Exception as e:
    print(f'抛出错误：{e}')  # 删除一个不在列表中的值。结果：抛出错误：list.remove(x): x not in list

"""
sort(key=None,reverse=False)
对列表进行原地排序
    key ： 指定带有一个参数的函数，用于从每个列表元素中提取比较值
    reverse : 默认值为 False 表示升序，为 True 表示降序
"""
# 列表排序 sort从小到大   reverse反转
list9 = [0, 89, -12, 56, 190]

# 倒序排列 ： 反转
list9.reverse()
print(list9)  # 结果 ：[190,56,-12,89,0]

# 从小到达排列
list9.sort()
print(list9)  # 结果：[-12, 0, 56, 89, 190]

# 从大到小
list9.sort(reverse=True)
print(list9)  # 结果：[190, 89, 56, 0, -12]

# 按照列表元素的长度排序   sort(key=len)
list10 = ['python', 'flask', 'vue', 'go', 'requests', 'selenium', 'pytest', 'allure']
list10.sort(key=len)
print(list10)  # 按照元素长度排序。结果：['go', 'vue', 'flask', 'python', 'pytest', 'allure', 'requests', 'selenium']

# reverse：反转
list18 = ['a', 'b', 'c']
list18.reverse()
# 结果：['c','b','a']
print(list18)

# 列表嵌套 二维数组
list11 = [[1, 3, 9], ['v', 'u', 'e']]
# 获取e字符
print(list11[1][2])  # 结果：e
list11[1].append("python")
# 结果是 [[1, 3, 9], ['v', 'u', 'e', 'python']]
print(list11)

# 将1-10中偶数的平方添加到一个列表
result = []
for ele in range(1, 11):
    if ele % 2 == 0:
        result.append(ele ** 2)
print(result)  # 结果：[4, 16, 36, 64, 100]

# 列表推导式  ： 循环创建列表，相当于 for 循环创建列表的简化版
result1 = [ele ** 2 for ele in range(1, 11) if ele % 2 == 0]
print(result1)  # 结果：[4, 16, 36, 64, 100]
